package xmlaufgabe2;

import java.awt.Color;
import java.awt.Font;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Random;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JLabel;
import javax.swing.JRadioButton;

/**
 * Panel als Container fuer saemtliche Komponenten (Radio Buttons, Button Groups,
 * StringPanel). Stellt die Komponenten dar und uebernimmt das Event Handling der
 * Komponenten.
 *
 * @author Adrian Cieluch
 * @version 1.0, 10/27/11
 */
public class EventPanel extends Panel implements ActionListener {

    /**
     * Logik und Daten zum String- und Fontaufbau
     */
    private AphorismStringGenerator aphoGen;
    /**
     * Darstellungsflaeche fuer Farben und String
     */
    private StringPanel displayArea;
    /**
     * Zur Anzeige der Schriftart und -groesse
     */
    private JLabel fontName;
    
    /**
     * Gruppiert alle Buttons zum Waehlen der Aphorismen
     */
    private ButtonGroup aphorismGroup;
    /**
     * Gruppiert alle Buttons zum Waehlen der Hintergrundfarben
     */
    private ButtonGroup bgColorGroup;
    /**
     * Gruppiert alle Buttons zum Waehlen der Schriftfarben
     */
    private ButtonGroup fontColorGroup;
    /**
     * Gruppiert alle Buttons zum Waehlen der Schriftarten
     */
    private ButtonGroup fontGroup;
    /**
     * Gruppiert alle Buttons zum Waehlen der Schriftstile
     */
    private ButtonGroup fontStyleGroup;
    /**
     * Gruppiert alle Buttons zum Waehlen der Schriftgroessen
     */
    private ButtonGroup fontSizeGroup;
    
    /**
     * Speichert alle Buttons zur Wahl der Aphorismen
     */
    private ArrayList<JRadioButton> aphorismButtons;
    /**
     * Speichert alle Buttons zur Wahl der Hintergrundfarbe
     */
    private ArrayList<JRadioButton> bgColorButtons;
    /**
     * Speichert alle Buttons zur Wahl der Schriftfarbe
     */
    private ArrayList<JRadioButton> fontColorButtons;
    /**
     * Speichert alle Buttons zur Wahl der Schriftarten
     */
    private ArrayList<JRadioButton> fontButtons;
    /**
     * Speichert alle Buttons zur Wahl der Schriftstile
     */
    private ArrayList<JRadioButton> fontStyleButtons;
    /**
     * Speichert alle Buttons zur Wahl der Schriftgroessen
     */
    private ArrayList<JRadioButton> fontSizeButtons;
    
    /**
     * Initialisiert alle anzuzeigenden Komponenten (Label, StringPanel, Buttons, ButtonGroups) und setzt die eigene Groesse
     * 
     * 
     * @param width Panelbreite
     * @param height Panelhoehe
     */
    public EventPanel(int width, int height) {
        aphoGen = new AphorismStringGenerator();
        displayArea = new StringPanel();
        fontName = new JLabel();

        aphorismGroup = new ButtonGroup();
        bgColorGroup = new ButtonGroup();
        fontColorGroup = new ButtonGroup();
        fontGroup = new ButtonGroup();
        fontStyleGroup = new ButtonGroup();
        fontSizeGroup = new ButtonGroup();

        aphorismButtons = new ArrayList<JRadioButton>();
        bgColorButtons = new ArrayList<JRadioButton>();
        fontColorButtons = new ArrayList<JRadioButton>();
        fontButtons = new ArrayList<JRadioButton>();
        fontStyleButtons = new ArrayList<JRadioButton>();
        fontSizeButtons = new ArrayList<JRadioButton>();

        this.setBounds(10, 10, width, height);
        this.setFont(aphoGen.getFont());
        
        initFontNameLabel(); 
        initStringPanel(width, height);
        initializeButtons();
        groupButtons();
    }
    
    /**
     * Prueft das uebergebene Action Event auf Uebereinstimmung mit den von den
     * Komponenten gesetzten Action Commands und veraendert bei Erfolg das
     * entsprechende Attribut des String Panels
     * 
     * @param e Ueber Input aufgerufene Action Event
     */
    @Override
    public void actionPerformed(ActionEvent e) {
        //Aphorisms
        for(int i = 0; i < aphoGen.getAphorismListSize(); i++) {
            if(("aphorism" + i).equals(e.getActionCommand())) {
                displayArea.setAphorism(aphoGen.getAphorismByIndex(i));
            }
        }
        
        //BG & Font Color
        for(int i = 0; i < aphoGen.getColorListSize(); i++) {
            if(("backgroundcolor" + i).equals(e.getActionCommand())) {
                displayArea.setBackgroundColor(aphoGen.getColorByIndex(i));
            }
            if("backgroundcolorrandom".equals(e.getActionCommand())) {
                Random r = new Random();
                displayArea.setBackgroundColor(new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256)));
            }
            
            if(("fontcolor" + i).equals(e.getActionCommand())) {
                displayArea.setFontColor(aphoGen.getColorByIndex(i));
            }
            if("fontcolorrandom".equals(e.getActionCommand())) {
                Random r = new Random();
                displayArea.setFontColor(new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256)));
            }
        }
        
        //Font
        for(int i = 0; i < aphoGen.getFontListSize(); i++) {
            if(("font" + i).equals(e.getActionCommand())) {
                displayArea.setFont(aphoGen.changeFont(i));
            }
            if("fontrandom".equals(e.getActionCommand())) {
                displayArea.setFont(aphoGen.changeRandomFont());
            }
        }
        
        //Font Style
        if(("style" + 0).equals(e.getActionCommand())) {
            displayArea.setFont(aphoGen.changeFontStyle(Font.PLAIN));
        }
        if(("style" + 1).equals(e.getActionCommand())) {
            displayArea.setFont(aphoGen.changeFontStyle(Font.BOLD));
        }
        if(("style" + 2).equals(e.getActionCommand())) {
            displayArea.setFont(aphoGen.changeFontStyle(Font.ITALIC));
        }
        if(("style" + 3).equals(e.getActionCommand())) {
            displayArea.setFont(aphoGen.changeFontStyle(Font.BOLD + Font.ITALIC));
        }
        
        //Font Size
        for(int i = 0; i < 6; i++) {
            if(("fontsize" + i).equals(e.getActionCommand())) {
                displayArea.setFont(aphoGen.changeFontSize(10 + 2*i));
            }
        }
        
        displayArea.repaint();
        fontName.setText(aphoGen.getFontName() + " " + aphoGen.getFontSize());
        fontName.repaint();
    }
    
    /**
     * Initialisiert das Label zur Anzeige der Schriftart und -groesse
     */
    public void initFontNameLabel() {
        fontName.setBounds(this.getWidth()/2 - 50, this.getHeight()-20, 150, 20);
        fontName.setForeground(Color.white);
        fontName.setText(aphoGen.getFontName() + " " + aphoGen.getFontSize());
        fontName.setVisible(true);
        this.add(fontName);
    }
    
    /**
     * Initialisiert das StringPanel und setzt dessen Dimensionen auf width und height
     * 
     * @param width Panelbreite
     * @param height Panelhoehe
     */
    public void initStringPanel(int width, int height) {
        displayArea.setBounds(10, 10, width, height);
        displayArea.setBorder(BorderFactory.createLoweredBevelBorder());
        displayArea.setAphorism(aphoGen.getAphorismByIndex(0));
        displayArea.setEnabled(true);
        displayArea.setVisible(true);
        
        this.add(displayArea);
    }
    
    /**
     * Initialisiert alle Buttons (Text, ActionCommand, Bounds, ActionListener
     * setzen) und fuegt die Buttons dem Panel hinzu
     * 
     */
    public void initializeButtons() {
        
        //Aphorisms
        for(int i = 0; i < aphoGen.getAphorismListSize(); i++) {
            aphorismButtons.add(new JRadioButton());
            aphorismButtons.get(i).setText("Apho: " + (i + 1));
            aphorismButtons.get(i).setActionCommand("aphorism" + i);
            aphorismButtons.get(i).setBounds(5 + 100 * i, 320, 80, 20);
            aphorismButtons.get(i).addActionListener(this);
            this.add(aphorismButtons.get(i));
        }

        //Background & Font Colors
        for(int i = 0; i < aphoGen.getColorListSize(); i++) {
            bgColorButtons.add(new JRadioButton());
            bgColorButtons.get(i).setText(aphoGen.getColorNameByIndex(i));
            bgColorButtons.get(i).setActionCommand("backgroundcolor" + i);
            bgColorButtons.get(i).setBounds(5 + 100 * i, 340, 80, 20);
            bgColorButtons.get(i).addActionListener(this);
            this.add(bgColorButtons.get(i));

            fontColorButtons.add(new JRadioButton());
            fontColorButtons.get(i).setText("F" + aphoGen.getColorNameByIndex(i));
            fontColorButtons.get(i).setActionCommand("fontcolor" + i);
            fontColorButtons.get(i).setBounds(5 + 100 * i, 360, 80, 20);
            fontColorButtons.get(i).addActionListener(this);
            this.add(fontColorButtons.get(i));
        }
        
        bgColorButtons.add(new JRadioButton());
        bgColorButtons.get(bgColorButtons.size()-1).setText("Random");
        bgColorButtons.get(bgColorButtons.size()-1).setActionCommand("backgroundcolorrandom");
        bgColorButtons.get(bgColorButtons.size()-1).setBounds(900, 340, 100, 20);
        bgColorButtons.get(bgColorButtons.size()-1).addActionListener(this);
        this.add(bgColorButtons.get(bgColorButtons.size()-1));
        
        fontColorButtons.add(new JRadioButton());
        fontColorButtons.get(fontColorButtons.size()-1).setText("Random");
        fontColorButtons.get(fontColorButtons.size()-1).setActionCommand("fontcolorrandom");
        fontColorButtons.get(fontColorButtons.size()-1).setBounds(900, 360, 100, 20);
        fontColorButtons.get(fontColorButtons.size()-1).addActionListener(this);
        this.add(fontColorButtons.get(fontColorButtons.size()-1));

        //Font
        for(int i = 0; i < aphoGen.getFontListSize(); i++) {
            fontButtons.add(new JRadioButton());
            fontButtons.get(i).setText(aphoGen.getFontByIndex(i));
            fontButtons.get(i).setActionCommand("font" + i);
            fontButtons.get(i).setBounds(5 + 100 * i, 380, 100, 20);
            fontButtons.get(i).addActionListener(this);
            this.add(fontButtons.get(i));
        }
        
        fontButtons.add(new JRadioButton());
        fontButtons.get(fontButtons.size()-1).setText("Random");
        fontButtons.get(fontButtons.size()-1).setActionCommand("fontrandom");
        fontButtons.get(fontButtons.size()-1).setBounds(900, 380, 100, 20);
        fontButtons.get(fontButtons.size()-1).addActionListener(this);
        this.add(fontButtons.get(fontButtons.size()-1));

        //Font Styles
        for(int i = 0; i < 4; i++) {
            fontStyleButtons.add(new JRadioButton());
            fontStyleButtons.get(i).setActionCommand("style" + i);
            fontStyleButtons.get(i).setBounds(5 + 100 * i, 400, 80, 20);
            fontStyleButtons.get(i).addActionListener(this);
            this.add(fontStyleButtons.get(i));
        }
        
        fontStyleButtons.get(0).setText("Plain");
        fontStyleButtons.get(1).setText("Bold");
        fontStyleButtons.get(2).setText("Cursive");
        fontStyleButtons.get(3).setText("Bold + Cursive");

        //Font Size
        for(int i = 0; i < 6; i++) {
            fontSizeButtons.add(new JRadioButton());
            fontSizeButtons.get(i).setText(Integer.toString(10 + (i * 2)));
            fontSizeButtons.get(i).setActionCommand("fontsize" + i);
            fontSizeButtons.get(i).setBounds(5 + 100 * i, 420, 80, 20);
            fontSizeButtons.get(i).addActionListener(this);
            this.add(fontSizeButtons.get(i));
        }
    }
    
    /**
     * Fuegt alle Buttons ihren respektiven ButtonGroups hinzu
     */
    public void groupButtons() {
       for(int i = 0; i < aphorismButtons.size(); i++) {
           aphorismGroup.add(aphorismButtons.get(i));
       }
       
       for(int i = 0; i < bgColorButtons.size(); i++) {
           bgColorGroup.add(bgColorButtons.get(i));
       }
       
       for(int i = 0; i < fontColorButtons.size(); i++) {
           fontColorGroup.add(fontColorButtons.get(i));
       }
       
       for(int i = 0; i < fontButtons.size(); i++) {
           fontGroup.add(fontButtons.get(i));
       }
       
       for(int i = 0; i < fontStyleButtons.size(); i++) {
           fontStyleGroup.add(fontStyleButtons.get(i));
       }
       
       for(int i = 0; i < fontSizeButtons.size(); i++) {
           fontSizeGroup.add(fontSizeButtons.get(i));
       }
    }
    
}
